package recados;

import gui.ajuda.Reportar;
import gui.logado.Logado;
import gui.logado.chat.Chat;
import gui.logado.mensagens.Mensagens;
import gui.logado.mensagens.enviar.Enviar;
import gui.logado.mensagens.receber.CaixaEntrada;
import gui.logado.minhaconta.MinhaConta;
import gui.logado.minhaconta.TrocarSenha;
import gui.naologado.Cadastro;
import gui.naologado.Login;
import gui.naologado.LoginMenu;
import gui.opcoes.Config;
import gui.opcoes.LoginConfig;
import gui.splash.Splash;
import gui.usuarios.Usuarios;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.midlet.MIDlet;
import net.sourceforge.floggy.persistence.FloggyException;
import net.sourceforge.floggy.persistence.ObjectSet;
import net.sourceforge.floggy.persistence.PersistableManager;

public class Recados extends MIDlet {

    private static final String SITE = "http://antoniodiego.comule.com/recados_app";
    private static Display display;
    //Telas
    private final Login login;
    //Mensagens
    private Mensagens mensagens;
    private Enviar enviar;
    private CaixaEntrada entrada;
    //Usuarios
    private Usuarios usuarios;
    //Configurar
    private MinhaConta avancado;
    private TrocarSenha trocasenha;
    //Outros 
    private Logado principal;
    private final Cadastro cadastra;
    private final Reportar reportar;
    private final Chat chat;
    private final LoginMenu loginMenu;
    //Outros  
    private final Config config;
    private final LoginConfig loginConfig;
    private boolean paused = false;
    private boolean logado = false;
    private Timer atualizador_timer;
    private static Recados instance;
    
    public Recados() {
        instance = this;

        display = Display.getDisplay(this);

        config = loadConfig();
        loginConfig = loadLoginConfig();

        login = new Login(this);
        cadastra = new Cadastro(this);
        reportar = new Reportar(this);
        chat = new Chat(this);

        usuarios = new Usuarios();
        loginMenu = new LoginMenu();

        login.campoNome.setString(loginConfig.getNome());
        login.campoSenha.setString(loginConfig.getSenha());
        
    }

    public static String getSITE() {
        return SITE;
    }

    public Login getLogin() {
        return login;
    }

    public Mensagens getMensagens() {
        return mensagens;
    }

    public Enviar getEnviar() {
        return enviar;
    }

    public CaixaEntrada getEntrada() {
        return entrada;
    }

    public Usuarios getUsuarios() {
        return usuarios;
    }

    public MinhaConta getAvancado() {
        return avancado;
    }

    public TrocarSenha getTrocasenha() {
        return trocasenha;
    }

    public Logado getPrincipal() {
        return principal;
    }

    public Cadastro getCadastra() {
        return cadastra;
    }

    public Reportar getReportar() {
        return reportar;
    }

    public Chat getChat() {
        return chat;
    }

    public LoginMenu getLoginMenu() {
        return loginMenu;
    }

    public Config getConfig() {
        return config;
    }

    public LoginConfig getLoginConfig() {
        return loginConfig;
    }

    public boolean isPaused() {
        return paused;
    }

    public boolean isLogado() {
        return logado;
    }

    public Timer getAtualizador_timer() {
        return atualizador_timer;
    }

    private Config loadConfig() {
        try {
            PersistableManager pm = PersistableManager.getInstance();
            ObjectSet conf = pm.find(Config.class, null, null);

            if (conf.size() > 0) {
                return (Config) conf.get(0);
            } else {
                return new Config();
            }
        } catch (FloggyException ex) {
            return new Config();
        }
    }

    private LoginConfig loadLoginConfig() {
        try {
            PersistableManager pm = PersistableManager.getInstance();
            ObjectSet conf = pm.find(LoginConfig.class, null, null);

            if (conf.size() > 0) {
                return (LoginConfig) conf.get(0);
            } else {
                return new LoginConfig("", "");
            }
        } catch (FloggyException ex) {
            return new LoginConfig("", "");
        }
    }

    public void startAtualizador() {
        if (getAtualizador_timer() != null) {
            getAtualizador_timer().cancel();
            atualizador_timer = null;
        }

        TimerTask atualizaMensagens = new TimerTask() {

            public void run() {
                getEntrada().run();
            }
        };

        TimerTask listaUsuarios = new TimerTask() {

            public void run() {
                usuarios.run();
            }
        };

        atualizador_timer = new Timer();

        int intervalo_msg = getConfig().getAtualizaMensagens();
        int intervalo_user = getConfig().getAtualizaUsuarios();

        if (intervalo_msg > 0) {
            getAtualizador_timer().scheduleAtFixedRate(atualizaMensagens, 2000, intervalo_msg * 60 * 1000);
        }

        if (intervalo_user > 0) {
            getAtualizador_timer().scheduleAtFixedRate(listaUsuarios, 2000, intervalo_user * 60 * 1000);
        }
    }

    public void delogged() {
        principal = null;
        mensagens = null;
        enviar = null;
        entrada = null;
        avancado = null;
        trocasenha = null;

        getAtualizador_timer().cancel();
        atualizador_timer = null;

        logado = false;
    }

    public void logged() {
        principal = new Logado(this);
        mensagens = new Mensagens(this);
        enviar = new Enviar(this);
        entrada = new CaixaEntrada(this);

        avancado = new MinhaConta(this);
        trocasenha = new TrocarSenha(this);

        startAtualizador();

        logado = true;
    }

    public void destroyApp(boolean arg0) {
        PersistableManager pm = PersistableManager.getInstance();

        try {
            pm.shutdown();
        } catch (FloggyException ex) {
        }

        if (isLogado()) {
            getPrincipal().run();
        }

        notifyDestroyed();
    }

    protected void pauseApp() {
        paused = true;
        notifyPaused();
    }

    protected void startApp() {

        if (!isPaused()) {
            Splash s = new Splash(this);
            setCurrent(s);
            s.play();
        }

        paused = false;

    }

    public static void setCurrent(Displayable next) {
        display.setCurrent(next);
    }

    public static void setCurrent(Alert alerta, Displayable next) {
        display.setCurrent(alerta, next);
    }

    public static Recados getInstance() {
        return instance;
    }
}
